package com.css.zfzx.fwsjcj.commen.util;

import net.coobird.thumbnailator.Thumbnails;
import org.apache.commons.lang3.StringUtils;

import java.io.*;
import java.util.ArrayList;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

/**
 * @Author leon
 * @Date: 2021/4/28 5:21 下午
 */
public class ImageByteUtil2 {
    private static float QUALITY = 0.6f;

    public static void compressZip(List<File> listfiles, OutputStream output, String encode, boolean compress, String alias) {
        ZipOutputStream zipStream = null;
        try {
            zipStream = new ZipOutputStream(output);
            for (File file : listfiles) {
                String name = file.getName();
                // 文件名称格式
                if (StringUtils.isNotBlank(alias)) {
                    alias += "_" + name + "_" + (listfiles.indexOf(file) + 1);
                } else {
                    alias += "_" + (listfiles.indexOf(file) + 1);
                }
                compressZip(file, zipStream, compress, alias);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (zipStream != null) {
                    zipStream.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    private static void compressZip(File file, ZipOutputStream zipStream,
                                    boolean compress, String alias) throws Exception {
        FileInputStream input = null;
        try {
            input = new FileInputStream(file);
            //zip(input, zipStream, file.getName(), compress);
            zip(input, zipStream, alias + "." + file.getName().substring(file.getName().lastIndexOf(".") + 1), compress);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (input != null)
                    input.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    private static void zip(InputStream input, ZipOutputStream zipStream,
                            String zipEntryName, boolean compress) throws Exception {
        byte[] bytes = null;
        BufferedInputStream bufferStream = null;
        try {
            if (input == null)
                throw new Exception("获取压缩的数据项失败! 数据项名为：" + zipEntryName);
            // 压缩条目不是具体独立的文件，而是压缩包文件列表中的列表项，称为条目，就像索引一样
            ZipEntry zipEntry = new ZipEntry("图片/" + zipEntryName);
            // 定位到该压缩条目位置，开始写入文件到压缩包中
            zipStream.putNextEntry(zipEntry);
            if (compress) {
                bytes = ImageByteUtil2.compressOfQuality(input, 0);
                zipStream.write(bytes, 0, bytes.length);
            } else {
                bytes = new byte[1024 * 5];// 读写缓冲区
                bufferStream = new BufferedInputStream(input);// 输入缓冲流
                int read = 0;
                while ((read = bufferStream.read(bytes)) != -1) {
                    zipStream.write(bytes, 0, read);
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (null != bufferStream)
                    bufferStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    public static byte[] compressOfQuality(File file, float quality) throws Exception {
        byte[] bs = null;
        InputStream input = null;
        try {
            input = new FileInputStream(file);
            bs = compressOfQuality(input, quality);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (input != null)
                    input.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return bs;
    }

    public static byte[] compressOfQuality(InputStream input, float quality)
            throws Exception {
        ByteArrayOutputStream output = null;
        try {
            output = new ByteArrayOutputStream();
            if (quality == 0) {
                Thumbnails.of(input).scale(1f).outputQuality(QUALITY)
                        .toOutputStream(output);
            } else {
                Thumbnails.of(input).scale(1f).outputQuality(quality).toOutputStream(output);
            }
            return output.toByteArray();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (output != null)
                    output.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return null;
    }

    public static void main(String[] args) {
        //要导出的文件集合,添加自己需要导出的文件
        List<File> ListFiles = new ArrayList<>();
        //调用工具类,参数说明（需要导出的文件集，ByteArrayOutputStream对象，编码，是否压缩【true，false】，文件名称前缀）
        //ImageByteUtil2.compressZip(ListFiles, out, "UTF-8", false, "LWJ");
        //指定导出格式
        /*ReturnContext.addParam("exportFileName", "extFile.zip");
        ReturnContext.addParam("mimeType", "zip");
        return in;*/
    }
}
